home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 20 / Cream of the Crop 20 (Terry Blount) (1996).iso / program / pcl4p51.zip / SIMPLE16.PAS < prev    next >
Pascal/Delphi Source File  |  1996-06-05  |  6KB  |  189 lines

  1.  
  2. (*********************************************)
  3. (*                                           *)
  4. (*        SIMPLE16.PAS      June 96          *)
  5. (*                                           *)
  6. (*    16-bit DPMI Protected Mode Version     *)
  7. (*    Compile:  BPC /CP SIMPLE16             *)
  8. (*                                           *)
  9. (*  This program is donated to the Public    *)
  10. (*  Domain by MarshallSoft Computing, Inc.   *)
  11. (*  It is provided as an example of the use  *)
  12. (*  of the Personal Communications Library.  *)
  13. (*                                           *)
  14. (*********************************************)
  15.  
  16.  
  17. program simple;
  18. uses crt, WinAPI, PCL4P16, use_dpmi;
  19.  
  20. var
  21.    BaudCode : Integer;
  22.    RetCode  : Integer;
  23.    Byte : Char;
  24.    i    : Integer;
  25.    Port : Integer;
  26.    ResetFlag : Boolean;
  27.    Handle    : LongInt;
  28.    RxSelector  : Integer;
  29.    TxSelector  : Integer;
  30.    DPMIversion : LongInt;
  31.  
  32. procedure SayError( Code : Integer );
  33. var
  34.    RetCode : Integer;
  35. begin
  36.    if Code < 0 then RetCode := SioError( Code )
  37.    else if (Code and (FramingError or ParityError or OverrunError)) <> 0 then
  38.       begin (* Port Error *)
  39.          if (Code and FramingError) <> 0 then writeln('Framing Error');
  40.          if (Code and ParityError)  <> 0 then writeln('Parity Error');
  41.          if (Code and OverrunError) <> 0 then writeln('Overrun Error')
  42.       end
  43. end;
  44.  
  45. procedure MyHalt( Code : Integer );
  46. var
  47.    RetCode : Integer;
  48. begin
  49.    if Code < 0 then SayError( Code );
  50.    if ResetFlag then RetCode := SioDone(Port);
  51.    writeln('*** HALTING ***');
  52.    Halt;
  53. end;
  54.  
  55. function MatchBaud(BaudString : String) : Integer;
  56. const
  57.    BaudRateArray : array[1..10] of LongInt =
  58.        (300,600,1200,2400,4800,9600,19200,38400,57600,115200);
  59. var
  60.    i : Integer;
  61.    BaudRate: LongInt;
  62.    RetCode : Integer;
  63. begin
  64.   Val(BaudString,BaudRate,RetCode);
  65.   if RetCode <> 0 then
  66.   begin
  67.     MatchBaud := -1;
  68.     exit;
  69.   end;
  70.   for i := 1 to 10 do if BaudRateArray[i] = BaudRate then
  71.   begin
  72.     MatchBaud := i - 1;
  73.     exit;
  74.   end;
  75.   (* no match *)
  76.   MatchBaud := -1;
  77. end;
  78.  
  79. begin   (* main program *)
  80.    ResetFlag := FALSE;
  81.    RxSelector := 0;
  82.    TxSelector := 0;
  83.    (* fetch PORT # from command line *)
  84.    if ParamCount <> 2 then
  85.       begin
  86.          writeln('USAGE: "SIMPLE16 <port> <baud rate>" where port = 1 to 20');
  87.          halt;
  88.       end;
  89.    Val( ParamStr(1),Port, RetCode );
  90.    if RetCode <> 0 then
  91.       begin
  92.          writeln('Port must be 1 to 20');
  93.          Halt;
  94.       end;
  95.    (* COM1 = 0, COM2 = 1, etc. *)
  96.    Port := Port - 1;
  97.    if (Port<COM1) or (Port>COM20) then
  98.       begin
  99.          writeln('Port must be 1 to 20');
  100.          Halt
  101.       end;
  102.    (* get baud rate *)
  103.    BaudCode := MatchBaud(ParamStr(2));
  104.    DPMIversion := LOWORD( DPMI_GetVersion );
  105.    writeln('DPMI version ', (DPMIversion SHR 8),'.',(255 and DPMIversion) );
  106.    (* setup 1K receive buffer in DOS memory *)
  107.    Handle := GlobalDosAlloc(1024);
  108.    RxSelector :=  LOWORD(Handle);
  109.    RetCode := SioRxBuf(Port, RxSelector, Size1024);
  110.    if RetCode < 0 then MyHalt( RetCode );
  111.    if SioInfo('I') > 0 then
  112.      begin
  113.        (* setup 128 transmit buffer in DOS memory *)
  114.        Handle := GlobalDosAlloc(128);
  115.        TxSelector := LOWORD(Handle);
  116.        RetCode := SioTxBuf(Port, TxSelector, Size128);
  117.        if RetCode < 0 then MyHalt( RetCode );
  118.      end;
  119.    (* reset port *)
  120.    RetCode := SioReset(Port,BaudCode);
  121.    (* if error then try one more time *)
  122.    if RetCode <> 0 then RetCode := SioReset(Port,BaudCode);
  123.    (* Was port reset ? *)
  124.    if RetCode <> 0 then
  125.      begin
  126.         writeln('Cannot reset COM',Port+1);
  127.         MyHalt( RetCode );
  128.      end;
  129.    (* Port successfully reset *)
  130.    writeln;
  131.    writeln('COM',1+Port,' @ ',ParamStr(2));
  132.  
  133.    (* display DPMI version *)
  134.    DPMIversion := LOWORD( DPMI_GetVersion );
  135.    writeln('DPMI version ', (DPMIversion SHR 8),'.',(255 and DPMIversion) );
  136.    ResetFlag := TRUE;
  137.    (* specify parity, # stop bits, and word length for port *)
  138.    RetCode := SioParms(Port, NoParity, OneStopBit, WordLength8);
  139.    if RetCode < 0 then MyHalt( RetCode );
  140.  
  141.    (* set FIFO level if have INS16550 *)
  142.    RetCode := SioFIFO(Port, LEVEL_8);
  143.    if RetCode < 0 then MyHalt( RetCode );
  144.  
  145.    RetCode := SioRxClear(Port);
  146.    if RetCode < 0 then MyHalt( RetCode );
  147.  
  148.    (* set DTR & RTS *)
  149.    RetCode := SioDTR(Port,SetPort);
  150.    RetCode := SioRTS(Port,SetPort);
  151.    (* begin terminal loop *)
  152.    writeln('Enter terminal loop ( Type ^Z to exit )');
  153.    while TRUE do
  154.       begin
  155.          (* did user press Ctrl-BREAK ? *)
  156.          if SioBrkKey then
  157.             begin
  158.                writeln('User typed Ctl-BREAK');
  159.                RetCode := SioDone(Port);
  160.                Halt;
  161.             end;
  162.          (* check for data overrun *)
  163.          if (SioLine(Port) AND OverrunError) <> 0 then writeln('Overrun!');
  164.          (* anything incoming over serial port ? *)
  165.          RetCode := SioGetc(Port,0);
  166.          if RetCode < -1 then MyHalt( RetCode );
  167.          if RetCode > -1 then Write( chr(RetCode) );
  168.          (* has user pressed keyboard ? *)
  169.          if KeyPressed then
  170.             begin
  171.                (* read keyboard *)
  172.                Byte := ReadKey;
  173.                (* quit if user types ^Z *)
  174.                if Byte = chr($1a) then
  175.                   begin
  176.                      writeln('User typed ^Z');
  177.                      RetCode := SioDone(Port);
  178.                      (* free DOS memory *)
  179.                      if RxSelector <> 0 then GlobalDosFree(RxSelector);
  180.                      if TxSelector <> 0 then GlobalDosFree(TxSelector);
  181.                      Halt;
  182.                   end;
  183.                (* send out over serial line *)
  184.                RetCode := SioPutc(Port, Byte );
  185.                if RetCode < 0 then MyHalt( RetCode );
  186.             end
  187.       end
  188. end.
  189.